package ig.util;

import ig.finanzas.Flujo;
import ig.finanzas.LibreriaOperacionesFinancieras;
import ig.util.ejb.IGBean;
import ig.util.excepciones.DatoInvalidoExcepcion;
import ig.util.excepciones.LogicaExcepcion;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Collection;
import java.util.ArrayList;

/*
 * ClienteTir.java
 *
 * Created on 30 de marzo de 2006, 10:27 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
/**
 *
 * @author jsanchez
 */
public class TirOfFlujo {

    /** Creates a new instance of ClienteTir */
    public TirOfFlujo() {
    }

    public static Double getTirDocumentoPortafolio(Connection connectionreport, String usuario, String pwd, Timestamp fechaD, Timestamp fechaC, Double Valor1, Double Valor2, Double codorig, Double codportaf) {
        Collection collection = new ArrayList();
        //IGBean util = new IGBean();
        PreparedStatement pstmt1 = null;
        ResultSet resultado = null;
        try {

            //creamos el objeto del valor inicial que se adicionara al la collection
            Flujo flujo = new Flujo(fechaD, -Valor1, 0.0, 0.0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        }

        try {
//            Connection connection=util.getConexion("METRICADB");

            //preparamos el query a ejecutar
            pstmt1 = connectionreport.prepareStatement("select FECHA AS FECHA," +
                    "CASE I_E WHEN 'I' THEN 1 ELSE -1 END * VALOR*VALMONEDA AS CAPITAL," +
                    "0 AS INTERESFIJO,0 AS INTERESVARIABLE,1 AS CONOCIDO " +
                    "FROM INVPEND " +
                    "WHERE CODORIG= ? " +
                    "AND CODPORTAF= ? " +
                    "AND FECHA<=? AND FECHA>? ORDER BY FECHA");

            //adicionamos los atributos al query

            pstmt1.setDouble(1, codorig);
            pstmt1.setDouble(2, codportaf);
            pstmt1.setTimestamp(3, fechaC);
            pstmt1.setTimestamp(4, fechaD);

            //ejecutamos el query
            resultado = pstmt1.executeQuery();

            //recorremos el resultqado del query
            while (resultado.next()) {

                //Nombres de las columnas de la tabla
                //IDCONTRATO     FECHA     CAPITAL     INTERESFIJO     INTERESVARIABLE     CONOCIDO

                //Constructor de Flujos
                //Date fecha, double capital, double interesfijo, double interesvariable, boolean conocido

                //creamos el objeto que se adicionara al la collection
                Flujo flujo = new Flujo(
                        resultado.getDate("FECHA"),
                        resultado.getDouble("CAPITAL"),
                        resultado.getDouble("INTERESFIJO"),
                        resultado.getDouble("INTERESVARIABLE"),
                        resultado.getBoolean("CONOCIDO"), false);

                //adicionamos el objeto a la collection
                collection.add(flujo);
            }

            //creamos el objeto del valor final que se adicionara al la collection
            Flujo flujo = new Flujo(fechaC, Valor2, 0, 0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

            //ejecutamos el metodo que calcula la tir, le enviamos la collection generada

            Double TIR = LibreriaOperacionesFinancieras.tir(collection);
            System.out.println("TIR:" + TIR);
            return TIR;
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        } catch (LogicaExcepcion ex) {
            ex.printStackTrace();
        } finally {
            try {
                pstmt1.close();
            } catch (Exception e) {
            }
            try {
                resultado.close();
            } catch (Exception e) {
            }
        }
        return null;
    }

    public static Double getTirPortafolio(Connection connectionreport, String usuario, String pwd, Timestamp fechaD, Timestamp fechaC, Double Valor1, Double Valor2, Double codportaf) {
        Collection collection = new ArrayList();
        IGBean util = new IGBean();
        try {

            //creamos el objeto del valor inicial que se adicionara al la collection
            Flujo flujo = new Flujo(fechaD, -Valor1, 0.0, 0.0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        }
        PreparedStatement pstmt1 = null;
        ResultSet resultado = null;
        try {
            //pedimos la conexion
//            Connection connection=util.getConexion("METRICADB");

            //preparamos el query a ejecutar
            pstmt1 = connectionreport.prepareStatement("SELECT FECHA AS FECHA, " +
                    "CASE I_E WHEN 'I' THEN 1 ELSE -1 END * VALOR*VALMONEDA AS CAPITAL, 0 AS INTERESFIJO,0 AS INTERESVARIABLE,1 AS CONOCIDO  " +
                    "FROM INVPEND  " +
                    "WHERE CODPORTAF= ? AND FECHA<=? AND FECHA>?  " +
                    "UNION ALL  " +
                    "SELECT T.FECHA,VALORMDO*VALMONCALC AS CAPITAL, 0 AS INTERESFIJO,0 AS INTERESVARIABLE,1 AS CONOCIDO  " +
                    "FROM TRASLADOSPORT T  " +
                    "		INNER JOIN PARTIDAS P  " +
                    "		ON T.CODORIG = P.CODORIG AND P.CODIGODOC = T.CODIGODOC  " +
                    "WHERE PORTAFORIGEN = ?  AND FECHA<= ? AND FECHA>?  " +
                    "UNION ALL  " +
                    "SELECT T.FECHA,VALORMDO*VALMONCALC*(-1) AS VALOR, 0 AS INTERESFIJO,0 AS INTERESVARIABLE,1 AS CONOCIDO  " +
                    "FROM TRASLADOSPORT T  " +
                    "		INNER JOIN PARTIDAS P  " +
                    "		ON T.CODORIG = P.CODORIG AND P.CODIGODOC = T.CODIGODOC  " +
                    "WHERE PORTAFDESTINO = ?  AND FECHA<= ? AND FECHA>?  " +
                    "ORDER BY FECHA ");

            //adicionamos los atributos al query

            pstmt1.setDouble(1, codportaf);
            pstmt1.setTimestamp(2, fechaC);
            pstmt1.setTimestamp(3, fechaD);

            pstmt1.setDouble(4, codportaf);
            pstmt1.setTimestamp(5, fechaC);
            pstmt1.setTimestamp(6, fechaD);

            pstmt1.setDouble(7, codportaf);
            pstmt1.setTimestamp(8, fechaC);
            pstmt1.setTimestamp(9, fechaD);

            //ejecutamos el query
            resultado = pstmt1.executeQuery();

            //recorremos el resultqado del query
            while (resultado.next()) {

                //Nombres de las columnas de la tabla
                //IDCONTRATO     FECHA     CAPITAL     INTERESFIJO     INTERESVARIABLE     CONOCIDO

                //Constructor de Flujos
                //Date fecha, double capital, double interesfijo, double interesvariable, boolean conocido

                //creamos el objeto que se adicionara al la collection
                Flujo flujo = new Flujo(
                        resultado.getDate("FECHA"),
                        resultado.getDouble("CAPITAL"),
                        resultado.getDouble("INTERESFIJO"),
                        resultado.getDouble("INTERESVARIABLE"),
                        resultado.getBoolean("CONOCIDO"),
                        false);

                //adicionamos el objeto a la collection
                collection.add(flujo);
            }

            //creamos el objeto del valor final que se adicionara al la collection
            Flujo flujo = new Flujo(fechaC, Valor2, 0, 0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

            //ejecutamos el metodo que calcula la tir, le enviamos la collection generada

            Double TIR = LibreriaOperacionesFinancieras.tir(collection);
            System.out.println("TIR:::" + TIR);
            return TIR;
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        } catch (LogicaExcepcion ex) {
            ex.printStackTrace();
        } finally {
            try {
                pstmt1.close();
            } catch (Exception e) {
            }
            try {
                resultado.close();
            } catch (Exception e) {
            }
        }

        return null;
    }

    public static Double getTirEspecie(Connection connectionreport, String usuario, String pwd, Timestamp fechaD, Timestamp fechaC, Double Valor1, Double Valor2, Double codigotit) {
        Collection collection = new ArrayList();
        IGBean util = new IGBean();
        try {

            //creamos el objeto del valor inicial que se adicionara al la collection
            Flujo flujo = new Flujo(fechaD, -Valor1, 0.0, 0.0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        }
        PreparedStatement pstmt1 = null;
        ResultSet resultado = null;
        try {
            //pedimos la conexion
//            Connection connection=util.getConexion("METRICADB");

            //preparamos el query a ejecutar
            pstmt1 = connectionreport.prepareStatement("select FECHA AS FECHA," +
                    "CASE I_E WHEN 'I' THEN 1 ELSE -1 END * VALOR*VALMONEDA AS CAPITAL," +
                    "0 AS INTERESFIJO,0 AS INTERESVARIABLE,1 AS CONOCIDO " +
                    "FROM INVPEND " +
                    "WHERE  CODIGOTIT= ? " +
                    "AND FECHA<=? AND FECHA>? ORDER BY FECHA");

            //adicionamos los atributos al query

            pstmt1.setDouble(1, codigotit);
            pstmt1.setTimestamp(2, fechaC);
            pstmt1.setTimestamp(3, fechaD);

            //ejecutamos el query
            resultado = pstmt1.executeQuery();

            //recorremos el resultqado del query
            while (resultado.next()) {

                //Nombres de las columnas de la tabla
                //IDCONTRATO     FECHA     CAPITAL     INTERESFIJO     INTERESVARIABLE     CONOCIDO

                //Constructor de Flujos
                //Date fecha, double capital, double interesfijo, double interesvariable, boolean conocido

                //creamos el objeto que se adicionara al la collection
                Flujo flujo = new Flujo(
                        resultado.getDate("FECHA"),
                        resultado.getDouble("CAPITAL"),
                        resultado.getDouble("INTERESFIJO"),
                        resultado.getDouble("INTERESVARIABLE"),
                        resultado.getBoolean("CONOCIDO"), false);

                //adicionamos el objeto a la collection
                collection.add(flujo);
            }

            //creamos el objeto del valor final que se adicionara al la collection
            Flujo flujo = new Flujo(fechaC, Valor2, 0, 0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

            //ejecutamos el metodo que calcula la tir, le enviamos la collection generada

            Double TIR = LibreriaOperacionesFinancieras.tir(collection);
            System.out.println("TIR:" + TIR);
            return TIR;
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        } catch (LogicaExcepcion ex) {
            ex.printStackTrace();
        } finally {
            try {
                pstmt1.close();
            } catch (Exception e) {
            }
            try {
                resultado.close();
            } catch (Exception e) {
            }
        }
        return null;
    }

    public static Double getTirEspeciePortafolio(Connection connectionreport, String usuario, String pwd, Timestamp fechaD, Timestamp fechaC, Double Valor1, Double Valor2, Double codigotit, Double codportaf) {
        Collection collection = new ArrayList();
        IGBean util = new IGBean();
        try {

            //creamos el objeto del valor inicial que se adicionara al la collection
            Flujo flujo = new Flujo(fechaD, -Valor1, 0.0, 0.0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        }
        PreparedStatement pstmt1 = null;
        ResultSet resultado = null;
        try {
            //pedimos la conexion
//            Connection connection=util.getConexion("METRICADB");

            //preparamos el query a ejecutar
            pstmt1 = connectionreport.prepareStatement("SELECT FECHA AS FECHA, " +
                    "CASE I_E WHEN 'I' THEN 1 ELSE -1 END * VALOR*VALMONEDA AS CAPITAL, 0 AS INTERESFIJO,0 AS INTERESVARIABLE,1 AS CONOCIDO  " +
                    "FROM INVPEND  " +
                    "WHERE CODIGOTIT= ? AND CODPORTAF= ? AND FECHA<=? AND FECHA>?  " +
                    "UNION ALL  " +
                    "SELECT T.FECHA,VALORMDO*VALMONCALC AS CAPITAL, 0 AS INTERESFIJO,0 AS INTERESVARIABLE,1 AS CONOCIDO  " +
                    "FROM TRASLADOSPORT T  " +
                    "		INNER JOIN PARTIDAS P  " +
                    "		ON T.CODORIG = P.CODORIG AND P.CODIGODOC = T.CODIGODOC  " +
                    "WHERE PORTAFORIGEN = ? AND P.CODIGOTIT = ? AND FECHA<= ? AND FECHA>?  " +
                    "UNION ALL  " +
                    "SELECT T.FECHA,VALORMDO*VALMONCALC*(-1) AS VALOR, 0 AS INTERESFIJO,0 AS INTERESVARIABLE,1 AS CONOCIDO  " +
                    "FROM TRASLADOSPORT T  " +
                    "		INNER JOIN PARTIDAS P  " +
                    "		ON T.CODORIG = P.CODORIG AND P.CODIGODOC = T.CODIGODOC  " +
                    "WHERE PORTAFDESTINO = ? AND P.CODIGOTIT = ? AND FECHA<= ? AND FECHA>?  " +
                    "ORDER BY FECHA ");
            //adicionamos los atributos al query

            pstmt1.setDouble(1, codigotit);
            pstmt1.setDouble(2, codportaf);
            pstmt1.setTimestamp(3, fechaC);
            pstmt1.setTimestamp(4, fechaD);

            pstmt1.setDouble(5, codportaf);
            pstmt1.setDouble(6, codigotit);
            pstmt1.setTimestamp(7, fechaC);
            pstmt1.setTimestamp(8, fechaD);

            pstmt1.setDouble(9, codportaf);
            pstmt1.setDouble(10, codigotit);
            pstmt1.setTimestamp(11, fechaC);
            pstmt1.setTimestamp(12, fechaD);


//ejecutamos el query
            resultado = pstmt1.executeQuery();

            //recorremos el resultqado del query
            while (resultado.next()) {

                //Nombres de las columnas de la tabla
                //IDCONTRATO     FECHA     CAPITAL     INTERESFIJO     INTERESVARIABLE     CONOCIDO

                //Constructor de Flujos
                //Date fecha, double capital, double interesfijo, double interesvariable, boolean conocido

                //creamos el objeto que se adicionara al la collection
                Flujo flujo = new Flujo(
                        resultado.getDate("FECHA"),
                        resultado.getDouble("CAPITAL"),
                        resultado.getDouble("INTERESFIJO"),
                        resultado.getDouble("INTERESVARIABLE"),
                        resultado.getBoolean("CONOCIDO"), false);

                //adicionamos el objeto a la collection
                collection.add(flujo);
            }

            //creamos el objeto del valor final que se adicionara al la collection
            Flujo flujo = new Flujo(fechaC, Valor2, 0, 0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

            //ejecutamos el metodo que calcula la tir, le enviamos la collection generada
            pstmt1.close();
            Double TIR = LibreriaOperacionesFinancieras.tir(collection);
            System.out.println("TIR:" + TIR);
            return TIR;
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        } catch (LogicaExcepcion ex) {
            ex.printStackTrace();
        } finally {
            try {
                pstmt1.close();
            } catch (Exception e) {
            }
            try {
                resultado.close();
            } catch (Exception e) {
            }
        }
        return null;
    }

    public static Double getTirCompania(Connection connectionreport, String usuario, String pwd, Timestamp fechaD, Timestamp fechaC, Double Valor1, Double Valor2, Double compania) {
        Collection collection = new ArrayList();
        IGBean util = new IGBean();
        try {

            //creamos el objeto del valor inicial que se adicionara al la collection
            Flujo flujo = new Flujo(fechaD, -Valor1, 0.0, 0.0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        }
        PreparedStatement pstmt1 = null;
        ResultSet resultado = null;
        try {
            //pedimos la conexion

//            Connection connection=util.getConexion("METRICADB");

            //preparamos el query a ejecutar
            pstmt1 = connectionreport.prepareStatement("select FECHA AS FECHA," +
                    "CASE I_E WHEN 'I' THEN 1 ELSE -1 END * VALOR*VALMONEDA AS CAPITAL," +
                    "0 AS INTERESFIJO,0 AS INTERESVARIABLE,1 AS CONOCIDO " +
                    "FROM INVPEND INNER JOIN PORTAFOL P ON " +
                    "INVPEND.CODPORTAF = P.CODPORTAF " +
                    "WHERE  P.CODCIA= ? " +
                    "AND FECHA<=? AND FECHA>? ORDER BY FECHA");

            //adicionamos los atributos al query

            pstmt1.setDouble(1, compania);
            pstmt1.setTimestamp(2, fechaC);
            pstmt1.setTimestamp(3, fechaD);

            //ejecutamos el query
            resultado = pstmt1.executeQuery();

            //recorremos el resultqado del query
            while (resultado.next()) {

                //Nombres de las columnas de la tabla
                //IDCONTRATO     FECHA     CAPITAL     INTERESFIJO     INTERESVARIABLE     CONOCIDO

                //Constructor de Flujos
                //Date fecha, double capital, double interesfijo, double interesvariable, boolean conocido

                //creamos el objeto que se adicionara al la collection
                Flujo flujo = new Flujo(
                        resultado.getDate("FECHA"),
                        resultado.getDouble("CAPITAL"),
                        resultado.getDouble("INTERESFIJO"),
                        resultado.getDouble("INTERESVARIABLE"),
                        resultado.getBoolean("CONOCIDO"), false);

                //adicionamos el objeto a la collection
                collection.add(flujo);
            }

            //creamos el objeto del valor final que se adicionara al la collection
            Flujo flujo = new Flujo(fechaC, Valor2, 0, 0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

            //ejecutamos el metodo que calcula la tir, le enviamos la collection generada

            Double TIR = LibreriaOperacionesFinancieras.tir(collection);
            System.out.println("TIR::" + TIR);
            return TIR;
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        } catch (LogicaExcepcion ex) {
            ex.printStackTrace();
        } finally {
            try {
                pstmt1.close();
            } catch (Exception e) {
            }
            try {
                resultado.close();
            } catch (Exception e) {
            }
        }
        return null;
    }

    public static Double getTirTotal(Connection connectionreport, String usuario, String pwd, Timestamp fechaD, Timestamp fechaC, Double Valor1, Double Valor2) {
        Collection collection = new ArrayList();
        IGBean util = new IGBean();
        try {

            //creamos el objeto del valor inicial que se adicionara al la collection
            Flujo flujo = new Flujo(fechaD, -Valor1, 0.0, 0.0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        }
        PreparedStatement pstmt1 = null;
        ResultSet resultado = null;
        try {
            //pedimos la conexion

//            Connection connection=util.getConexion("METRICADB");

            //preparamos el query a ejecutar
            pstmt1 = connectionreport.prepareStatement("select FECHA AS FECHA," +
                    "CASE I_E WHEN 'I' THEN 1 ELSE -1 END * VALOR*VALMONEDA AS CAPITAL," +
                    "0 AS INTERESFIJO,0 AS INTERESVARIABLE,1 AS CONOCIDO " +
                    "FROM INVPEND  " +
                    "WHERE  " +
                    "FECHA<=? AND FECHA>? ORDER BY FECHA");

            //adicionamos los atributos al query

            pstmt1.setTimestamp(1, fechaC);
            pstmt1.setTimestamp(2, fechaD);

            //ejecutamos el query
            resultado = pstmt1.executeQuery();

            //recorremos el resultqado del query
            while (resultado.next()) {

                //Nombres de las columnas de la tabla
                //IDCONTRATO     FECHA     CAPITAL     INTERESFIJO     INTERESVARIABLE     CONOCIDO

                //Constructor de Flujos
                //Date fecha, double capital, double interesfijo, double interesvariable, boolean conocido

                //creamos el objeto que se adicionara al la collection
                Flujo flujo = new Flujo(
                        resultado.getDate("FECHA"),
                        resultado.getDouble("CAPITAL"),
                        resultado.getDouble("INTERESFIJO"),
                        resultado.getDouble("INTERESVARIABLE"),
                        resultado.getBoolean("CONOCIDO"), false);

                //adicionamos el objeto a la collection
                collection.add(flujo);
            }

            //creamos el objeto del valor final que se adicionara al la collection
            Flujo flujo = new Flujo(fechaC, Valor2, 0, 0, true, false);
            //adicionamos el objeto a la collection
            collection.add(flujo);

            //ejecutamos el metodo que calcula la tir, le enviamos la collection generada

            Double TIR = LibreriaOperacionesFinancieras.tir(collection);
            System.out.println("TIR:" + TIR);
            return TIR;
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        } catch (LogicaExcepcion ex) {
            ex.printStackTrace();
        } finally {
            try {
                pstmt1.close();
            } catch (Exception e) {
            }
            try {
                resultado.close();
            } catch (Exception e) {
            }
        }
        return null;
    }

    public static Double getTir(Connection connectionreport, String usuario, String pwd, String cadenaSQL, Timestamp fechaD) {
        Collection collection = new ArrayList();
        PreparedStatement pstmt1 = null;
        ResultSet resultado = null;

        System.out.println("--Entre a get tir--");
        System.out.println(cadenaSQL);
        try {

            pstmt1 = connectionreport.prepareStatement(cadenaSQL);
            int ocurrencias = cadenaSQL.replace("?", "@").split("@").length;

            //adicionamos la fecha al statement
            for (int i = 1; i < ocurrencias; i++) {
                pstmt1.setTimestamp(i, fechaD);
            }

            //ejecutamos el query
            resultado = pstmt1.executeQuery();
            
            //recorremos el resultqado del query
            while (resultado.next()) {
                //Nombres de las columnas de la tabla
                //IDCONTRATO     FECHA     CAPITAL     INTERESFIJO     INTERESVARIABLE     CONOCIDO                

                //creamos el objeto que se adicionara al la collection
                Flujo flujo = new Flujo(
                        resultado.getDate("FECHA"),
                        resultado.getDouble("CAPITAL"),
                        resultado.getDouble("INTERESFIJO"),
                        resultado.getDouble("INTERESVARIABLE"),
                        resultado.getBoolean("CONOCIDO"), false);

                //adicionamos el objeto a la collection
                collection.add(flujo);
            }

            //creamos el objeto del valor final que se adicionara al la collection

            //ejecutamos el metodo que calcula la tir, le enviamos la collection generada

            Double TIR = LibreriaOperacionesFinancieras.tir(collection);
            //System.out.println("TIR:"+TIR);
            return TIR;
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        } catch (LogicaExcepcion ex) {
            ex.printStackTrace();
        } finally {
            try {
                pstmt1.close();
            } catch (Exception e) {
            }
            try {
                resultado.close();
            } catch (Exception e) {
            }
        }
        return null;
    }

    public static Double getTir(Connection connectionreport, String usuario, String pwd, String cadenaSQL, Timestamp fechaI, Timestamp fechaF) {
        Collection collection = new ArrayList();
        PreparedStatement pstmt1 = null;
        ResultSet resultado = null;
        try {
            int ocurrencias = cadenaSQL.replace("P1", "@").replace("P2", "@").split("@").length - 1;
            pstmt1 = connectionreport.prepareStatement(cadenaSQL.replaceAll("P1", "?").replaceAll("P2", "?"));
            String consultaOriginal = cadenaSQL;
            int x1 = 0;
            int x2 = 0;
            for (int i = 1; i <= ocurrencias; i++) {
                x1 = consultaOriginal.indexOf("P1");
                x2 = consultaOriginal.indexOf("P2");
                if ((x1 < x2 && x1 > 0) || (x1 > 0 && x2 < 0)) {
                    pstmt1.setTimestamp(i, fechaI);
                    consultaOriginal = consultaOriginal.replaceFirst("P1", "?");
                } else {
                    pstmt1.setTimestamp(i, fechaF);
                    consultaOriginal = consultaOriginal.replaceFirst("P2", "?");
                }
            }
            resultado = pstmt1.executeQuery();
            //recorremos el resultqado del query
            while (resultado.next()) {

                //Nombres de las columnas de la tabla
                //IDCONTRATO     FECHA     CAPITAL     INTERESFIJO     INTERESVARIABLE     CONOCIDO
                Flujo flujo = new Flujo(
                        resultado.getDate("FECHA"),
                        resultado.getDouble("CAPITAL"),
                        resultado.getDouble("INTERESFIJO"),
                        resultado.getDouble("INTERESVARIABLE"),
                        resultado.getBoolean("CONOCIDO"), false);

                //adicionamos el objeto a la collection
                collection.add(flujo);
            }
            //creamos el objeto del valor final que se adicionara al la collection            
            //ejecutamos el metodo que calcula la tir, le enviamos la collection generada

            Double TIR = LibreriaOperacionesFinancieras.tir(collection);
            System.out.println("TIR:" + TIR);
            return TIR;
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        } catch (LogicaExcepcion ex) {
            ex.printStackTrace();
        } finally {
            try {
                pstmt1.close();
            } catch (Exception e) {
            }
            try {
                resultado.close();
            } catch (Exception e) {
            }
        }
        return null;
    }

    public static Double getTir(Connection connectionreport, String usuario, String pwd, String cadenaSQL, Timestamp fechaI, Timestamp fechaF, Double v1, Double v2) {
        Collection collection = new ArrayList();
        PreparedStatement pstmt1 = null;
        ResultSet resultado = null;
        try {
            cadenaSQL = cadenaSQL.trim() + " ";
            int ocurrencias = cadenaSQL.toUpperCase().replace("P1", "@").replace("P2", "@").replace("VALOR1", "@").replace("VALOR2", "@").split("@").length - 1;
            pstmt1 = connectionreport.prepareStatement(cadenaSQL.toUpperCase().replace("P1", "?").replace("P2", "?").replace("VALOR1", "?").replace("VALOR2", "?"));
            String consultaOriginal = cadenaSQL.toUpperCase();
            System.out.println("consultaOriginal:"+consultaOriginal);
            for (int i = 1; i <= ocurrencias; i++) {

                int x1 = consultaOriginal.indexOf("P1");
                int x2 = consultaOriginal.indexOf("P2");

                int vx1 = consultaOriginal.indexOf("VALOR1");
                int vx2 = consultaOriginal.indexOf("VALOR2");

                if ((x1 > 0) && (x1 < x2 || x2 < 0) && (x1 < vx1 || vx1 < 0) && (x1 < vx2 || vx2 < 0)) {
                    pstmt1.setTimestamp(i, fechaI);
                    consultaOriginal = consultaOriginal.replaceFirst("P1", "?");
                } else if ((x2 > 0) && (x2 < x1 || x1 < 0) && (x2 < vx1 || vx1 < 0) && (x2 < vx2 || vx2 < 0)) {
                    pstmt1.setTimestamp(i, fechaF);
                    consultaOriginal = consultaOriginal.replaceFirst("P2", "?");
                } else if ((vx1 > 0) && (vx1 < x1 || x1 < 0) && (vx1 < x2 || x2 < 0) && (vx1 < vx2 || vx2 < 0)) {
                    pstmt1.setDouble(i, v1);
                    consultaOriginal = consultaOriginal.replaceFirst("VALOR1", "?");
                } else if ((vx2 > 0) && (vx2 < x1 || x1 < 0) && (vx2 < x2 || x2 < 0) && (vx2 < vx1 || vx1 < 0)) {
                    pstmt1.setDouble(i, v2);
                    consultaOriginal = consultaOriginal.replaceFirst("VALOR2", "?");
                }
            }
            resultado = pstmt1.executeQuery();
            //recorremos el resultqado del query
            System.out.println("fechaI : "+fechaI+", fechaF : "+fechaF+", Valor1:"+v1+", Valor2 : "+v2);
            while (resultado.next()) {

                //Nombres de las columnas de la tabla
                //IDCONTRATO     FECHA     CAPITAL     INTERESFIJO     INTERESVARIABLE     CONOCIDO
                Flujo flujo = new Flujo(
                        resultado.getDate("FECHA"),
                        resultado.getDouble("CAPITAL"),
                        resultado.getDouble("INTERESFIJO"),
                        resultado.getDouble("INTERESVARIABLE"),
                        resultado.getBoolean("CONOCIDO"), false);
                System.out.println("Fecha : "+flujo.getFecha()+", Capital : "+flujo.getCapital()+", Integer V"+flujo.getInteresVariable()+", Integer F"+flujo.getInteresFijo());
                //adicionamos el objeto a la collection
                collection.add(flujo);
            }
            //creamos el objeto del valor final que se adicionara al la collection
            //ejecutamos el metodo que calcula la tir, le enviamos la collection generada

            Double TIR = LibreriaOperacionesFinancieras.tir(collection);
            System.out.println("TIR:" + TIR);
            return TIR;
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (DatoInvalidoExcepcion ex) {
            ex.printStackTrace();
        } catch (LogicaExcepcion ex) {
            ex.printStackTrace();
        } finally {
            try {
                pstmt1.close();
            } catch (Exception e) {
            }
            try {
                resultado.close();
            } catch (Exception e) {
            }
        }
        return null;
    }
}
